package com.ejzblog.mall.result;

import com.ejzblog.mall.enums.ResponseStatusEnum;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;
import org.springframework.http.HttpStatus;

import java.io.Serializable;
import java.util.List;

import static com.ejzblog.mall.enums.ResponseStatusEnum.OK;

/**
 * <p>
 * Description：
 * </p>
 *
 * @author Mango
 * @version v1.0.0
 * @ProjectName: community-mall-master
 * @Package: com.ejzblog.mall.result
 * @date 2021-07-13 13:59
 * @see com.ejzblog.mall.result
 */
@Builder
@Setter
@Getter
@NoArgsConstructor
@AllArgsConstructor
@ToString
public class ResponseResultDTO<T> implements Serializable {

    private static final long serialVersionUID = -2213100509067841157L;

    /**
     * 业务结果
     */
    private T result;

    /**
     * 是否调用成功
     */
    private Boolean success;

    /**
     * HTTP请求编码
     *
     * @see ResponseStatusEnum
     */
    private Integer code;

    /**
     * 描述
     *
     * @see ResponseStatusEnum
     */
    private String message;

    /**
     * 成功返回结果
     *
     * @param model      T
     * @param statusEnum 自定义消息 {@link ResponseStatusEnum}
     * @param <T>        T
     * @return json类型
     */
    public static <T> ResponseResultDTO<T> success(T model, ResponseStatusEnum statusEnum) {
        return ResponseResultDTO.<T>builder()
                .success(true)
                .result(model)
                .code(HttpStatus.OK.value())
                .message(statusEnum.getMessage())
                .build();
    }

    /**
     * validator 自动验证参数返回message
     *
     * @param message 返回消息
     * @param <T>     Void
     * @return json类型
     */
    public static <T> ResponseResultDTO<T> error(String message) {
        return unSuccess(HttpStatus.INTERNAL_SERVER_ERROR.value(), message);
    }

    /**
     * 错误返回结果
     *
     * @param statusEnum 自定义消息 {@link ResponseStatusEnum}
     * @param <T>        Void
     * @return json类型
     */
    public static <T> ResponseResultDTO<T> unSuccess(ResponseStatusEnum statusEnum) {
        return unSuccess(statusEnum.getCode(), statusEnum.getDetails());
    }

    private static <T> ResponseResultDTO<T> unSuccess(Integer code, String message) {
        return ResponseResultDTO.<T>builder()
                .success(false)
                .code(code)
                .message(message)
                .build();
    }
    // ==========================================================================================================================================================================================

    /**
     * 总数
     */
    private Long total;

    /**
     * 每页显示条数，默认 10
     */
    private Long size;

    /**
     * 当前页
     */
    private Long current;

    /**
     * 列表数据
     */
    private List<T> data;

    /**
     * 特殊字符
     */
    private Object obj;

    /**
     * 分页返回
     *
     * @param total   总页数
     * @param size    每页条数
     * @param current 当前页
     * @param data    数据
     * @param obj     特殊字段
     * @param <T>     泛型
     * @return 集合
     */
    public static <T> ResponseResultDTO<T> pageResultDTO(Long total, Long size, Long current, List<T> data, Object obj) {
        return ResponseResultDTO.<T>builder()
                .total(total)
                .size(size)
                .current(current)
                .data(data)
                .obj(obj)
                .success(true)
                .code(OK.getCode())
                .message(OK.getMessage())
                .build();
    }

}
